草庐IT

c++ - Clang、std::next、libstdc++ 和 constexpr-ness

全部标签

c++ - 为什么 std::queue 不实现 insert() 而 std::deque 实现?

我正在阅读std::queue我想知道为什么没有方法可以通过一次操作有效地插入多个元素,而std::deque报价std::deque::insert? 最佳答案 Insert允许插入到结构中的任意位置。std::queue是FIFO结构的抽象接口(interface)。你只能在最后添加东西。底层结构不一定具有插入任意位置的有效方法(例如考虑std::vector)。因此std::queue没有通用的插入成员函数。由于一般的插入函数需要迭代器位置参数,提供多重插入是为了方便,这样您就不必跟踪下一个迭代器位置。推回不需要这个,因为不需

c++ - 从 Clang AST 中的 CXXConstructExpr 中检索模板参数

假设我有一个这样的变量声明:std::vectormyVector(1);这在ClangAST中表示为CXXConstructExpr。我有一个匹配器可以找到此CXXConstructExpr,但我想从中提取MyType的声明。我尝试了各种方法,但似乎没有任何效果:constCXXConstructExpr*construct=Result.Nodes.getNodeAs("expr");construct->getConstructor()->getTemplateSpecializationArgs()//Alwaysnullptrconstruct->getConstructor

c++ - std::shared_ptr<std::string const> 能否作为引用计数不可变字符串的有效实现?

理想情况下,不可变字符串类只需要为每个字符串分配一个内存。甚至引用计数也可以存储在与字符串本身相同的内存块中。string的简单实现和shared_ptr将为shared_ptr分配三block不同的内存:字符串缓冲区的内存字符串对象的内存引用计数的内存现在,我知道在使用std::make_shared()时,智能实现可以将最后两个组合成一个分配。但这仍然会留下两个分配。当您知道字符串是不可变的时,字符串缓冲区将不会被重新分配,因此应该可以将它与字符串对象集成在一起,只留下一次分配。我知道一些字符串实现已经对短字符串使用了这样的优化,但我正在寻找一个不管字符串长度如何都这样做的实现。我

c++ - 如何在 Travis CI 上使用 C++17 安装 clang?

我正在尝试使用clang4.0设置TrevisCI。我需要C++17支持。我使用以下脚本:language:cppsudo:requiredos:-linuxcompiler:-clangenv:-TARGET_CPU=x86BUILD_CONFIGURATION=Debug-TARGET_CPU=x86BUILD_CONFIGURATION=Release-TARGET_CPU=x64BUILD_CONFIGURATION=Debug-TARGET_CPU=x64BUILD_CONFIGURATION=Release-TARGET_CPU=amd64BUILD_CONFIGURATI

c++ - 将 `hana::string` 转换为 `constexpr const char (&)[]`

我有一些旧代码使用了与str_const非常相似的东西描述here和here做一些constexpr字符串操作。str_const是ScottSchurr描述的文字类型,可以从字符串文字构造,因为它具有来自constchar(&)[]的模板构造函数.我现在也有一些使用boost::hana的新代码.我希望能够参加hana::string并创建一个str_const那是指它。最简单的方法是转换hana::string到constexprconstchar(&)[].(实际上,在这一点上这不是最简单的方法,最简单的方法肯定是在我的str_const实现中添加一个新的模板构造函数。但在这一点

c++ - 如何使用 clang 格式分隔 lambda 的尾随返回类型

有几件事阻止我切换到clang格式。当我在应该换行到下一行的lambda上有一个尾随返回类型时,箭头和尾随返回类型之间没有空格。我该如何解决这个问题?例如,这是下面相同代码的未格式化版本的clang-format的输出autofunc(){return[.......](autoone,autolong_parameter_list,autoanother)->SomeLongReturnType;//^^^^^^^^^^^^^^^^^^^^^HowcanIaddaspaceinbetweenthose?} 最佳答案 TL;TR:升

c++ - 在 CUDA 源文件上使用 clang-tidy

存在多种专为C/C++设计的静态分析工具,但它们对于测试CUDA源代码并不是特别有用。自clangversion6能够编译CUDA,我想使用clang-tidy检查我的选项,它似乎没有切换架构的选项。有没有办法让它工作?例如用于打开CUDA解析器的编译时开关、自定义检查形式的扩展,或者它可能是计划中的功能? 最佳答案 基于clang的工具的一个问题是它们不以与clang完全相同的方式解析文件。第一个问题是,与C/C++编译不同,CUDA编译对源码进行了多次编译。默认情况下,当您给它一个CUDA文件时,clang会创建多个编译作业,并

c++ - Clang 静态分析器检查一个函数是否被调用了两次

我有一个新的自定义检查器(TransactionChecker.cpp)。这是交易状态:structTransactionState{private:enumKind{OpenedT,StartedT,FinalizedT,ClosedT}K;TransactionState(KindInK):K(InK){}public:boolisOpened()const{returnK==OpenedT;}boolisClosed()const{returnK==ClosedT;}boolisStarted()const{returnK==StartedT;}boolisFinalized()

具有 4 字节对齐缓冲区的 C++ `std::string` 类容器

我需要一个C++中的数据结构,它的作用类似于标准的字节容器,但将缓冲区对齐为四个字节的倍数。我想尽可能多地重用标准库抽象,而不是滚动我自己的抽象。到目前为止,我一直在使用std::string和std::vector来达到这个目的。不幸的是,我收到了有关最新MacOS的错误报告,显然string::data()不再是4字节对齐的,而是地址与1mod4一致。当我看到这个时,我当然没有意识到规范保证字符串将按4字节对齐。我可以切换到vector,但不幸的是现在我不确定为什么这应该是4字节对齐的。即使使用自定义分配器,vector实现也可能在它分配的缓冲区开始时做一些奇怪的事情。我的问题:从

c++ - 将列表初始化对插入 std::map

我正在尝试将一个只能移动的类型插入到map中。我有以下代码:#includeclassMoveable{public:Moveable()=default;Moveable(constMoveable&)=delete;Moveable(Moveable&&)=default;Moveable&operator=(constMoveable&)=delete;Moveable&operator=(Moveable&&)=default;};intmain(){std::mapmy_map;Moveablemy_moveable_1,my_moveable_2,my_moveable_3